﻿// 285. 没有上司的舞会 jichu.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>

using namespace std;
/*
https://www.acwing.com/problem/content/287/
Ural 大学有 N 名职员，编号为 1∼N。

他们的关系就像一棵以校长为根的树，父节点就是子节点的直接上司。

每个职员有一个快乐指数，用整数 Hi 给出，其中 1≤i≤N。

现在要召开一场周年庆宴会，不过，没有职员愿意和直接上司一起参会。

在满足这个条件的前提下，主办方希望邀请一部分职员参会，使得所有参会职员的快乐指数总和最大，求这个最大值。

输入格式
第一行一个整数 N。
接下来 N 行，第 i 行表示 i 号职员的快乐指数 Hi。
接下来 N−1 行，每行输入一对整数 L,K，表示 K 是 L 的直接上司。

输出格式
输出最大的快乐指数。

数据范围
1≤N≤6000,
−128≤Hi≤127
输入样例：
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
输出样例：
5
*/


const int N = 6010;
int dp[N][2]; //	1 选中，0 未选中
int happy[N];
int h[N], e[N], ne[N], idx;
int n;
int has_father[N];
int root = 0;

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void dfs(int x) {
	if (h[x] == -1) {
		dp[x][1] = max(0, happy[x]);
		dp[x][0] = 0;
		return;
	}
	dp[x][1] = max(0, happy[x]);
	dp[x][0] = 0;
	for (int i = h[x]; i != -1; i = ne[i]) {
		int j = e[i];
		dfs(j);
		dp[x][1] += dp[j][0];
		dp[x][0] += max(dp[j][0], dp[j][1]);
	}

	return;
}

void solve() {
	dfs(root);
	cout << max(dp[root][0], dp[root][1]);
}


int main()
{
	memset(h, -1, sizeof h);

	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> happy[i];
	}

	for (int i = 1; i <= n - 1; i++) {
		int l, k; cin >> l >> k; add(k, l);
		has_father[l] = 1;
	}

	//找到起点
	for (int i = 1; i <= n; i++) {
		if (has_father[i] == 0) {
			root = i; break;
		}
	}

	solve();

	return 0;
}

